package lv.servidordisqueria.server.accion;

import java.util.ArrayList;
import java.util.Collection;

import lv.mensajeriadisqueria.dto.MusicoDto;
import lv.mensajeriadisqueria.idomain.IMusico;
import lv.mensajeriadisqueria.mensaje.Mensaje;
import lv.servidordisqueria.domain.Musico;
import lv.servidordisqueria.repositorio.Repositorio;

public class MusicoAccion implements Accion<IMusico>{

	private Repositorio<IMusico> repositorio;
	
	public MusicoAccion(){
		repositorio = new Repositorio<IMusico>();
	}
	
	/**
	 *  
	 * @param mensaje
	 * @return un nuevo mensaje para escribit
	 */
	public Mensaje actuar(Mensaje mensaje) {
		Mensaje respuesta = new Mensaje();
		IMusico musico = (IMusico)mensaje.getObjeto();
		if (Mensaje.ALTA.equalsIgnoreCase(mensaje.getMensaje())) {
			insertar(respuesta, musico);
		} else if (Mensaje.BAJA.equalsIgnoreCase(mensaje.getMensaje())) {
			borrar(respuesta, musico);
		} else if (Mensaje.MODIFICAR.equalsIgnoreCase(mensaje.getMensaje())) {
			modificar(respuesta, musico);
		} else if (Mensaje.TODOS.equalsIgnoreCase(mensaje.getMensaje())) {
			buscarTodos(respuesta);
		} else if (Mensaje.TODOS_GRUPOS.equalsIgnoreCase(mensaje.getMensaje())) {
			buscarTodosGrupos(respuesta, musico);
		}
		return respuesta;
	}

	
	private void buscarTodosGrupos(Mensaje respuesta, IMusico musicoDto) {
		try {
			System.out.println("entro a buscas todos los Grupos");
//			IMusico musico = tranformarDtoToDomain(musico);
//			List<IGrupo> grupos = tranformarDtoToDomainGrupo(musico);
			respuesta.setMensaje(Mensaje.ENVIO_TODOS);
//			respuesta.setObjeto(musicos);
			System.out.println("encontro todos los musicos");
		} catch (RuntimeException e) {
			respuesta.setMensaje(Mensaje.EXCEPTION);
			respuesta.setObjeto(e);
		}
	}

	public void buscarTodos(Mensaje respuesta) {
		try {
			System.out.println("entro a buscas todos los Musicos");
			Collection<IMusico> todosMusicos = repositorio.buscarTodos(Musico.class);
			Collection<IMusico> musicos = new ArrayList<IMusico>();
			for (IMusico musico : todosMusicos) {
				musicos.add(tranformarDomainToDto(musico));
			}
			respuesta.setMensaje(Mensaje.ENVIO_TODOS);
			respuesta.setObjeto(musicos);
			System.out.println("encontro todos los musicos");
		} catch (RuntimeException e) {
			respuesta.setMensaje(Mensaje.EXCEPTION);
			respuesta.setObjeto(e);
		}
	}

	public void modificar(Mensaje respuesta, IMusico musicoDto) {
		try {
			System.out.println("entro al Modificar");
			IMusico musico = repositorio.buscarPorId(Musico.class, musicoDto.getIdMusico());
			musico.setNacionalidad(musicoDto.getNacionalidad());
			musico.setNombre(musicoDto.getNombre());
			musico.setVivo(musicoDto.getVivo());
			repositorio.editar(musico);
			respuesta.setMensaje(Mensaje.MODIFICADO);
			System.out.println(Mensaje.MODIFICADO);
		} catch (RuntimeException e) {
			respuesta.setMensaje(Mensaje.EXCEPTION);
			respuesta.setObjeto(e);
		}
	}

	public void borrar(Mensaje respuesta, IMusico musicoDto) {
		try {
			respuesta.setMensaje(Mensaje.BORRADO);
			IMusico musico = repositorio.buscarPorId(Musico.class, musicoDto.getIdMusico());
			repositorio.borradoFisico(musico);
		} catch (RuntimeException e) {
			respuesta.setMensaje(Mensaje.EXCEPTION);
			respuesta.setObjeto(e);
		}
	}

	public void insertar(Mensaje respuesta, IMusico musico) {
		try {
			respuesta.setMensaje(Mensaje.INSERTADO);
			IMusico musico2 = tranformarDtoToDomain(musico);
			repositorio.insertar(musico2);
			musico.setIdMusico(musico2.getIdMusico());
			respuesta.setObjeto(musico);
		} catch (RuntimeException e) {
			respuesta.setMensaje(Mensaje.EXCEPTION);
			respuesta.setObjeto(e);
		}
	}

	public IMusico tranformarDtoToDomain(IMusico musicoDto) {
		Musico musico = new Musico(musicoDto.getNombre(), musicoDto.getNacionalidad(), musicoDto.getVivo());
		musico.setIdMusico(musicoDto.getIdMusico());
		musico.setHabilitado(musicoDto.getHabilitado());
		return musico;
	}

	public IMusico tranformarDomainToDto(IMusico musico) {
		MusicoDto musicoDto = new MusicoDto(musico.getNombre(), musico.getNacionalidad(), musico.getVivo());
		musicoDto.setIdMusico(musico.getIdMusico());
		musicoDto.setHabilitado(musico.getHabilitado());
		return musicoDto;
	}
}